package Shifu.MainServer.Net;

import java.io.*;
import java.rmi.RemoteException;
import java.sql.SQLException;

/**
 * Shell che viene avviata sul client dopo
 * che il PeerServer è stato esportato e registrato.
 */

public class SeederShell extends LeecherShell {

	
	public SeederShell(String id) {
		super(id);
	}


	public void run() {

		this.printLogo();			
		this.getCommand();		//avvia la routine per la gestione dei comandi
	}


	public void getCommand() {

		InputStreamReader is = new InputStreamReader(System.in);
		BufferedReader buffer = new BufferedReader(is);

		try {

			String command = "";	//comando

			/* continua fino a che non viene dato il comando exit */
			while(!command.equals("exit")) {
	
				System.out.print("Shifu>");
				command = buffer.readLine();
				System.out.println("il comando è: "+command);
				// Discriminazione del comando dato

				if (command.equals("help")) {
					this.help();
				}

				else if (command.equals("id")) {
					this.id();
				}

				else if (command.equals("download")) {
					System.out.println("Richiesta download file");
					this.download();
				}

				else if (command.equals("filelist")) {
					System.out.println("Richiesta lista file");
					this.fileList();
				}

				else if (command.equals("peerlist")) {
					System.out.println("Richiesta lista peer");
					this.peerList();
				}

				else if (command.equals("online")) {
					int val = this.online();
					System.out.println("Sistema online: "+val);
				}

				else if (command.equals("upload")) {
					System.out.println("Richiesta upload file");
					this.upload();
				}

				else if (command.equals("promovepeer")) {
					System.out.println("Richiesta promozione peer");
					this.promove();
				}

				else if (command.equals("removefile")) {
					System.out.println("Richiesta rimozione file");
					this.remove();
				}

				else if (command.equals("exit")) {
					System.out.println("Arrivederci :-) ");
					this.exit();
				}

				else {
					System.out.println("Shifu: Comando sconosciuto. Guarda l'help !");
				}
			}
				

		} catch (IOException ioe) {
		 	System.out.println("Errore nel'input da tastiera"+ioe.getMessage());	
		}

		finally {

			try {
				is.close();	
			} catch (IOException io) {
				System.out.println("Shifu: Errore di IO !");
			}

		}		
	}

	public void printLogo() {
		
		System.out.println("\n\n***************************");
		System.out.println("**     Seeder Shell     **");
		System.out.println("***************************\n");
		System.out.print("Status ID: "+super.id+" \n\n");
	}


	public void help() {

		System.out.println("\n\nHELP:\n\n* id\n* help\n* filelist\n* peerlist\n* download\n* upload\n* removefile\n* promovepeer\n* exit\n");
	}
	
	public void upload() {

		String name = "";
		int result = 0;
		is = null;
	
		try {	

			System.out.print("Inserire il nome del file: ");
			is = new InputStreamReader(System.in);
			BufferedReader buffer = new BufferedReader(is);
			name = buffer.readLine();
			if (!name.equals("")) {
				SeederShellPeerServer castedstub = (SeederShellPeerServer) peerserverstub;
				result = castedstub.upload(name);
				if(result > 0) System.out.println("Upload del file eseguito con successo ");
				else System.out.println("Errore nell upload del file, upload annullato!");
			}

		} catch (IOException ioe) {	
			System.out.println("Errore di IO !");
		}

		if (result > 0) System.out.println("Upload del file: "+name+" terminato");

	}


	public void remove() {

		is = null;

		try {
			fileList();
			System.out.print("Inserisci il numero del file da eliminare: ");
			is = new InputStreamReader(System.in);
			BufferedReader buffer = new BufferedReader(is);
			String val = buffer.readLine();
			if (!val.equals("")) {
				int index = Integer.parseInt(val);
				SeederShellPeerServer castedstub = (SeederShellPeerServer) peerserverstub;
				int result = castedstub.removeFile(index);
				if(result > 0) System.out.println("Eliminazione file avvenuta !");
				else System.out.println("Errore nella rimozione del file, rimozione annullata!");
			}

		} catch (IOException io) {
			System.out.println("Errore di IO ! "+io.getMessage());
		}
	
	}


	public void promove() {

		is = null;

		try {
			peerList();
			System.out.print("Inserisci il numero del peer da promuovere: ");
			is = new InputStreamReader(System.in);
			BufferedReader buffer = new BufferedReader(is);
			String val = buffer.readLine();
			if (!val.equals("")) {
				int index = Integer.parseInt(val);
				SeederShellPeerServer castedstub = (SeederShellPeerServer) peerserverstub;
				int result = castedstub.promovePeer(index);
				if(result > 0) System.out.println("Promozione Peer avvenuta !");
				else System.out.println("Errore nell promozione del peer, promozione annullata!");
			}
		
		} catch (IOException io) {
			System.out.println("Shifu> Errore di IO !"+io.getMessage());
		}

	}

}
